package com.ccc.boot.response;

/**
 * API 统一返回状态码
 *
 * @author superC
 * @date 2022/3/23
 * @version 0.1.0
 */
public enum ResponseCode {
    /*
     * 1xxxx 系统相关状态码
     * 2xxxx 接口相关状态码
     * 3xxxx 数据相关状态码
     * 4xxxx 认证与授权相关状态码
     * 5xxxx 业务相关状态码
     * */

    /**
     * 未知错误
     */
    UNKNOWN(-1, "未知错误"),
    /**
     * 请求成功
     */
    SUCCESS(200, "请求成功"),
    /**
     * 认证失败
     */
    UNAUTHORIZED(401, "认证失败"),
    /**
     * 禁止访问
     */
    FORBIDDEN(403, "禁止访问"),

    NOT_FOUND(404, "请求的资源不存在"),

    SERVER_ERROR(500, "服务器内部错误"),

    // ------------------------------------------------------- 系统相关状态码：10000-19999 Start
    /**
     * 请求失败
     */
    FAILURE(10001, "请求失败"),
    /**
     * 系统繁忙，请稍后重试
     */
    SYSTEM_INNER_ERROR(10002, "系统繁忙，请稍后重试"),
    // ------------------------------------------------------- 系统相关状态码：End

    // ------------------------------------------------------- 接口相关状态码：20000-20049 Start
    /**
     * 内部系统接口调用异常
     */
    INTERFACE_INNER_INVOKE_ERROR(20001, "内部系统接口调用异常"),
    /**
     * 外部系统接口调用异常
     */
    INTERFACE_OUTER_INVOKE_ERROR(20002, "外部系统接口调用异常"),
    /**
     * 该接口禁止访问
     */
    INTERFACE_FORBID_VISIT(20003, "该接口禁止访问"),
    /**
     * 接口地址无效
     */
    INTERFACE_ADDRESS_INVALID(20004, "接口地址无效"),
    /**
     * 接口请求超时
     */
    INTERFACE_REQUEST_TIMEOUT(20005, "接口请求超时"),
    /**
     * 接口负载过高
     */
    INTERFACE_EXCEED_LOAD(20006, "接口负载过高"),
    /**
     * 接口发生熔断
     */
    INTERFACE_IS_FUSED(20007, "接口发生熔断"),
    /**
     * 请检查IP白名单配置是否正确
     */
    INTERFACE_IPTABLE_NULL(20008, "请检查IP白名单配置是否正确"),
    /**
     * 该接口禁止访问，当前IP未加入白名单
     */
    INTERFACE_NOT_ADD_IPTABLE(20009, "该接口禁止访问，当前IP未加入白名单"),
    // ------------------------------------------------------- 接口相关状态码：End

    // ------------------------------------------------------- 参数相关状态码：20050-20079 Start
    /**
     * 参数有误
     */
    PARAM_ERROR(20050, "参数有误"),
    /**
     * 参数无效
     */
    PARAM_IS_INVALID(20051, "参数无效"),
    /**
     * 参数为空
     */
    PARAM_IS_BLANK(20052, "参数为空"),
    /**
     * 参数类型错误
     */
    PARAM_TYPE_BIND_ERROR(20053, "参数类型错误"),
    /**
     * 参数缺失
     */
    PARAM_NOT_COMPLETE(20054, "参数缺失"),
    // ------------------------------------------------------- 参数相关状态码：End

    // ------------------------------------------------------- 数据相关状态码：30000-30099 Start
    /**
     * 数据未找到
     */
    RESULT_DATA_NONE(30001, "数据未找到"),
    /**
     * 数据有误
     */
    DATA_IS_WRONG(30002, "数据有误"),
    /**
     * 数据已存在
     */
    DATA_ALREADY_EXISTED(30003, "数据已存在"),
    /**
     * 数据过大
     */
    DATA_IS_LARGE(30004, "数据过大"),
    /**
     * 获取数据失败
     */
    DATA_GET_ERROR(30005, "获取数据失败"),
    /**
     * SQL异常
     */
    SQL_ERROR(30011, "SQL异常"),

    /**
     * 请选择文件
     */
    UPLOAD_FILE_NULL(30030, "请选择文件"),
    /**
     * 图片类型错误
     */
    IMAGE_IS_WRONG(30031, "仅支持 png jpg jpeg gif bmp webp 类型的图片"),
    /**
     * 上传照片失败
     */
    UPLOAD_IMAGE_ERROR(30032, "上传照片失败"),
    /**
     * 上传文件失败
     */
    UPLOAD_FILE_ERROR(30033, "上传文件失败"),
    /**
     * 文件已经存在
     */
    FILE_IS_EXIST(30034, "文件已经存在"),
    /**
     * 文件不存在
     */
    FILE_IS_NOT_EXIST(30035, "文件不存在"),

    /**
     * redis异常
     */
    REDIS_ERROR(30051, "redis异常"),

    // ------------------------------------------------------- 数据相关状态码：End

    // ------------------------------------------------------- 保存相关状态码：30030-30049 Start
    /**
     * 添加成功
     */
    DATA_ADD_SUCCESS(200, "添加成功"),
    /**
     * 添加失败
     */
    DATA_ADD_FAILURE(30032, "添加失败"),
    /**
     * 删除成功
     */
    DATA_DELETE_SUCCESS(200, "删除成功"),
    /**
     * 删除失败
     */
    DATA_DELETE_FAILURE(30034, "删除失败"),
    /**
     * 编辑成功
     */
    DATA_UPDATE_SUCCESS(200, "编辑成功"),
    /**
     * 编辑失败
     */
    DATA_UPDATE_FAILURE(30036, "编辑失败"),
    // ------------------------------------------------------- 保存相关状态码：End

    // ------------------------------------------------------- 认证相关状态码：40000-40099 Start
    /**
     * 生成token失败
     */
    GENERATE_PREFIX_ERROR(40000, "生成token失败"),
    /**
     *  获取token失败
     */
    GET_TOKEN_ERROR(40001, "获取token失败"),
    /**
     *  解析token失败
     */
    PARSE_TOKEN_ERROR(40002, "解析token失败"),
    /**
     * token已过期
     */
    TOKEN_EXPIRED_ERROR(40003, "token已过期，请重新登录"),
    /**
     * 令牌签名错误
     */
    TOKEN_SIGNATURE_ERROR(40004, "token签名错误"),
    /**
     * token为null或空
     */
    TOKEN_ISNULL_ERROR(40005, "无token，请重新登录"),
    /**
     * token前缀异常
     */
    TOKEN_PREFIX_ERROR(40006, "token前缀异常"),
    /**
     * token无效
     */
    TOKEN_IS_INVALID(40007, "token无效，请重新登录"),
    // ------------------------------------------------------- 认证相关状态码：End

    // ------------------------------------------------------- 授权相关状态码：40100-40199 Start
    /**
     * 获取资源失败
     */
    GET_RESOURCE_ERROR(40100, "获取资源失败"),
    /**
     * 无访问权限
     */
    PERMISSION_NO_ACCESS(40101, "无访问权限"),
    /**
     * 角色未分配权限
     */
    ROLE_NO_PERMISSION(40102, "角色未分配权限"),
    /**
     * 当前用户未分配角色
     */
    USER_NO_ROLE(40103, "当前用户未分配角色，请联系管理员"),
    // ------------------------------------------------------- 授权相关状态码：End

    // ------------------------------------------------------- 用户相关状态码：40200-20299 Start
    /**
     * 用户未登录
     */
    USER_NOT_LOGGED_IN(40201, "用户未登录"),
    /**
     * 用户不存在
     */
    USER_NOT_EXIST(40202, "用户不存在"),
    /**
     * 密码错误
     */
    LOGIN_PASSWORD_ERROR(40203, "密码错误"),

    /**
     * 验证码不能为空
     */
    LOGIN_CAPTCHR_ISNULL(40203, "验证码不能为空"),

    /**
     * 获取验证码失败
     */
    LOGIN_GET_CAPTCHR_FAILURE(40204, "获取验证码失败"),

    /**
     * 验证码已过期
     */
    LOGIN_CAPTCHA_EXPIPE(40205, "验证码已过期"),

    /**
     * 验证码错误
     */
    LOGIN_CAPTCHA_ERR(40206, "验证码错误"),

    /**
     * 登录失败
     */
    LOGIN_ERROR_CODE(40207, "登录失败"),

    /**
     * 登出失败
     */
    LOGOUT_ERROR_CODE(40208, "登出失败"),

    /**
     * 账号已被禁用
     */
    USER_ACCOUNT_FORBIDDEN(40211, "账号已被禁用"),
    /**
     * 登录账号为必填项
     */
    USER_ACCOUNT_HAS_REQUIRED(40212, "登录账号为必填项"),
    /**
     * 用户已存在
     */
    USER_IS_EXISTED(40213, "用户已存在"),
    /**
     * 昵称已存在
     */
    USER_NICK_IS_EXISTED(40214, "昵称已存在"),
    /**
     * 邮箱已存在
     */
    USER_EMAIL_IS_EXISTED(40215, "邮箱已存在"),
    /**
     * 邮箱激活失败
     */
    USER_EMAIL_ACTIVATION_FAILURE(40216, "邮箱激活失败"),
    /**
     * 邮箱尚未激活
     */
    USER_EMAIL_FORBIDDEN(402017, "邮箱尚未激活"),
    /**
     * 邮箱不存在
     */
    USER_EMAIL_NOT_EXIST(40218, "邮箱不存在"),
    /**
     * 邮箱地址错误
     */
    USER_EMAIL_ERROR(40219, "邮箱地址错误"),
    /**
     * 密码不能为空
     */
    USER_PASSWORD_NOT_NULL(40220, "密码不能为空"),
    /**
     * 两次密码输入不一致
     */
    USER_PASSWORD_NOT_EQUALS(40221, "两次密码输入不一致"),
    /**
     * 手机号码为必填项
     */
    USER_PHONE_HAS_REQUIRED(40222, "手机号码为必填项"),
    /**
     * 手机号码已存在
     */
    USER_PHONE_IS_EXISTED(40223, "手机号码已存在"),
    /**
     * 手机号码无效
     */
    USER_PHONE_IS_INVALID(40224, "手机号码无效"),
    // ------------------------------------------------------- 用户相关状态码：End

    // ------------------------------------------------------- 业务相关状态码：50001-59999 Start

    // ------------------------------------------------------- 业务相关状态码：End

    ;

    private Integer code;

    private String message;

    ResponseCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public Integer code() {
        return this.code;
    }

    public String message() {
        return this.message;
    }

    public static String getMessage(String name) {
        for (ResponseCode item : ResponseCode.values()) {
            if (item.name().equals(name)) {
                return item.message;
            }
        }
        return name;
    }

    public static Integer getCode(String name) {
        for (ResponseCode item : ResponseCode.values()) {
            if (item.name().equals(name)) {
                return item.code;
            }
        }
        return null;
    }

    @Override
    public String toString() {
        return this.name();
    }
}